package xyz.cerberu.cet.global.utils;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

/**
 * @author β世界
 * Created on 15:57
 * @Description 切点工具类
 */
public class AopUtils {

    /**
     * @author β世界 on 15:59 2020/8/17
     * 获取指定参数中的一个参数
     * @param clazz: 需要获取参数的类型
     * @param paramenterName: 需要获取参数的参数名
     * @param point: 切点对象
     * @return java.lang.Object
     **/
    public static Object getParamenter(Class<?> clazz, String paramenterName, ProceedingJoinPoint point){
        Object[] args = point.getArgs();
        String[] argNames = ((MethodSignature) point.getSignature()).getParameterNames();
        // 检查两个数组的长度是否一致
        if(args.length == argNames.length){
            for (int i = 0; i < args.length; i++) {
                // 判断类型和名字是否一致
                if(args[i] != null && clazz.isAssignableFrom(args[i].getClass()) && argNames[i].equals(paramenterName)){
                    return args[i];
                }
            }
        }
        return null;
    }

}
